/**
 * Created by 余华杰 on 2015/5/22.
 */
$(document).ready(function(){
    //初始化队列
    var readyQueue=new Array(3);
    for (var x =0;x<5;x++){
        readyQueue[x]=new ReadyQueue(1,new Array(0));
    }
    /*
     * 创建新的进程
     */
    $("#create").click(function(){
        var pid=parseInt(Math.random()*100);
        var status=Status[0];
        var priority=parseInt(Math.random()*50);
        var next=0;
        var life=Life[parseInt(Math.random()*5)];
        var process=new Process(pid,status,priority,next,life);
        readyQueue[0].insertProcess(process);
        process.create($("div.queue_one"));
    });

    $("#delete").click(function(){
        var index=readyQueue.index;
        var index_process=readyQueue['Queue'][index];
        var life=parseInt(index_process.life);
        readyQueue[0].deleteProcess();
    });

    var t;//设置循环的setInterval对象

    /*
     * 改变正在运行的进程的显示状态
     * @param queue_index 所选的就绪队列的下标
     * @param list_index 所选的队列中的进程下标
     */
    function running_process_status(queue_index,list_index){
        //获取所选的队列中的进程
        var index_process=readyQueue[queue_index]['Queue'][list_index];
        /*
         * 当前执行的进程显示区域
         * 进行内容更新
         */
        $("div.running_process>div.running_process_content")
            .empty()
            .append("pid=",index_process.pid,
            "<br>life=",index_process.life,
            "<br>next=",index_process.next==null?0:index_process.next.pid,
            "<br>priority=",index_process.priority,
            "<br>status=",index_process.status);
    }

    /*
     * 队列的类名
     */
    var queue_class=["div.queue_one","div.queue_two","div.queue_three","div.queue_four","div.queue_five"]



    /*
     * 循环执行进程调度
     */
    function timeOut(time) {
        t=setInterval(timeOutFunc, time);
    }

    function timeOutFunc(){
        var index_queue=-1;
        var length=new Array(5);
        length[0]=$(".queue_one").children("div").length;
        length[1]=$(".queue_two").children("div").length;
        length[2]=$(".queue_three").children("div").length;
        length[3]=$(".queue_four").children("div").length;
        length[4]=$(".queue_five").children("div").length;
        var x=0;
        while(x<5){
            if(length[x]>0){
                index_queue=x;
                break;
            }
            x++;
        }
        if(index_queue==-1)
            clearInterval(t);
        $(".cms-index").text(index_queue+1);
        //当前就绪队列的当前进程的下标
        var index = readyQueue[index_queue]['index'];
        running_process_status(index_queue,index);
        /*
         * index_process 当前执行的进程
         */
        var index_process = readyQueue[parseInt(index_queue)]['Queue'][index];
        var life = parseInt(index_process.life);//取得当前执行的进程的原本的生命周期
        index_process.decLife();  //当前执行的进程生命周期-1

        //当前执行的PCB
        var $index_process = $($("div.cms-priority")[0]);


        /*
         * 选择当前执行的PCB的内容，并作修改
         */
        var $child_status=$index_process.children("div").children("span#status");
        $child_status.text("run");

        var $child_life=$index_process.children("div").children("span#life");
        $child_life.text(life-1);

        var $child_next=$index_process.children("div").children("span#next");
        $child_next.text(0);
        /*
         * 延时进行PCB的转移，让当前的进程PCB的状态得到显示更新
         */
        setTimeout(function(){
            if (index_process.life > 0){
                readyQueue[index_queue].deleteProcess();
                readyQueue[index_queue+1].insertProcess(index_process);
                index_process.create($(queue_class[index_queue+1]));
            }
            else if(index_process.life<=0){
                readyQueue[index_queue].deleteProcess();
                return;
            }
        },1000);

    }

    $("#run").click(function(){
        /*
         * 每执行time毫秒后，当前的进程的生命周期减1
         */
        var time=$("input#time").val()==''?1500:$("input#time").val();
        alert("进程调度的时间为"+time);
        timeOut(time);
    });

    $("#stop").click(function(){
        clearInterval(t);
    });

});
